//
//  ViewController.m
//  IOS_Block
//
//  Created by 李腾飞 on 15/4/7.
//  Copyright (c) 2015年 李腾飞. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    //  第一个block
    [self blockBegin];

}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
}

#pragma mark- Declaring and Using a Block
//  一、格式：
//  返回值（^名字）（参数列表）=^（参数列表）{body}
//  You declare them using syntax similar to that you use to declare a pointer to a function, except that you use ^ instead of *.——就和函数指针一样一样的

//  二、TypeDef
//  typedef float (^MyBlockType)(float, float);
//  MyBlockType myFirstBlock = // ... ;
//  MyBlockType mySecondBlock = // ... ;

//  三、作为全局变量出现
//  #import <stdio.h>
//  int GlobalInt = 0;
//  int (^getGlobalInt)(void) = ^{ return GlobalInt; };

//  四、block中的几种变量
//  全局变量，包括静态的本地变量——读写
//  全局函数，（这个并不是技术上的变量）
//  本地变量，和同一个作用域的参数——看做常量
//  _block 读写

-(void)blockBegin
{
    int multiplier = 7;
    int (^myBlock)(int) = ^(int num) {
        return num * multiplier;
    };
    NSLog(@"%d",myBlock(3));
}

//  视图给局部变量赋值——报错
-(void)blockGiveValue
{
    int x = 123;
    static int x1=123;
    __block int x2 = 123;
    void (^printXAndY)(int) = ^(int y) {
//        x = x + y; // error
        x1=20;
        x2=10;
        printf("%d %d\n", x, y);
    };
}
#pragma mark- Using a Block Directly
//  直接使用Block————————————————————这个完全看不懂嘛

-(void)blockDirectly
{
    char *myCharacters[3] = { "TomJohn", "George", "Charles Condomine" };
    
    qsort_b(myCharacters, 3, sizeof(char *), ^(const void *l, const void *r) {
        char *left = *(char **)l;
        char *right = *(char **)r;
        return strncmp(left, right, 1);
    });
    for (int i=0; i<3; i++) {
        NSLog(@"%s",myCharacters[i]);
    }
}

#pragma mark- Blocks with Cocoa
//



@end
